222. 完全二叉树的节点个数

给出一个完全二叉树,求出该树的节点个数。

说明:

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含1~ 2h个节点。

示例:

输入: 
    1
   / \
  2   3
 / \  /
4  5 6

输出: 6

思路:

  • 从根节点开始遍历左子树的高度和右子树的高度
  • 左子树和右子树高度相等时,该树为满二叉树,直接得到节点数量
  • 当左子树高度比右子树高时,该树不为满二叉树,对左子树和右子树遍历,并加上1(根节点)
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def countNodes(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if not root:
            return 0
        
        left_depth, right_depth = 1, 1
        left_node, right_node = root.left, root.right
        
        while left_node:
            left_depth += 1
            left_node = left_node.left
            
        while right_node:
            right_depth += 1
            right_node = right_node.right
            
        if left_depth == right_depth:    
            return (1<<left_depth) - 1
        
        if left_depth > right_depth:    
            return self.countNodes(root.left) + self.countNodes(root.right) + 1
posted @ 2018-09-20 18:10  yuyin  阅读(351)  评论(0编辑  收藏  举报